package tools

import (
	"github.com/go-xorm/xorm"
	"github.com/topaz-h/gin-web/model"
)

// DbEngine 全局的xorm引擎
var DbEngine *OrmEngine

// OrmEngine 方便使用xorm.Engine对象来操作数据库
type OrmEngine struct {
	*xorm.Engine
}

// CreateOrmEngine 连接MySQL数据库
func CreateOrmEngine(config *Config) (*OrmEngine, error) {
	database := config.Database
	// `parseTime=true` 将mysql中的时间类型，自动解析为go结构体中的时间类型
	// 不加会报错，无法解析
	dsn := database.Username + ":" + database.Password + "@tcp(" + database.Host + ":" + database.Port + ")/" + database.DbName + "?charset=" + database.Charset + "&parseTime=true&loc=Local"
	engine, err := xorm.NewEngine(database.Driver, dsn)
	if err != nil {
		return nil, err
	}

	// 执行的数据库操作的时候是否打印出sql语句「接收布尔值」
	engine.ShowSQL(database.ShowSQL)

	// Sync和Sync2(优化后的方法，使用更加普遍)
	// model中的结构体实体映射为数据库中为sms_code的表
	// NOTICE: `no new variables on left side of :=` 右边没有新变量，err不用重复声明
	err = engine.Sync2(
		new(model.SmsCode),
		new(model.Member),
	)
	if err != nil {
		return nil, err
	}
	ormEngine := new(OrmEngine)
	ormEngine.Engine = engine

	// 赋值给全局的ormEngine
	DbEngine = ormEngine

	return ormEngine, nil
}
